package com.emerquim.bean.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import com.emerquim.persistence.dao.PEntidad;
import com.emerquim.persistence.dao.PEntidadDAO;
import com.icesoft.faces.component.datapaginator.DataPaginator;

public class ManejadorEntidades {	

	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(ManejadorEntidades.class);

	private List<Entidad> listaEntidades;
	private String nombreEntidad;
	private DataPaginator dataPaginator = new DataPaginator();

	/**
	 * @return the listaEntidades
	 */
	public List<Entidad> getListaEntidades() {
		return listaEntidades;
	}

	/**
	 * @param listaEntidades
	 *            the listaEntidades to set
	 */
	public void setListaEntidades(List<Entidad> listaEntidades) {
		this.listaEntidades = listaEntidades;
	}

	/**
	 * @return the nombreEntidad
	 */
	public String getNombreEntidad() {
		return nombreEntidad;
	}

	/**
	 * @param nombreEntidad
	 *            the nombreEntidad to set
	 */
	public void setNombreEntidad(String nombreEntidad) {
		this.nombreEntidad = nombreEntidad;
	}

	/**
	 * Constructor de la clase
	 */
	public ManejadorEntidades() {
		this.nombreEntidad = "";
		this.listaEntidades = new ArrayList<Entidad>();
	}
	
	/**
	 * Metodo para limpiar los datos temporales de una consulta
	 * @author Felipe Criales
	 */
	public void limpiarDatosConsulta(){
		this.nombreEntidad = "";
		this.listaEntidades = new ArrayList<Entidad>();
	}

	public void buscarEntidad(ActionEvent event) {

		PEntidadDAO pEntidadDAO = new PEntidadDAO();
		try {
			this.listaEntidades = new ArrayList<Entidad>();
			List listaEntidades = pEntidadDAO.findByPropertyLike("entNom", this.nombreEntidad);
			Iterator<PEntidad> it = listaEntidades.iterator();
			while(it.hasNext()) {
				this.listaEntidades.add(this.crearEntidad(it.next()));
			}
		} catch (HibernateException e) {
			log.error("Error al buscar los agentes en la base de datos", e);
		} finally {
			pEntidadDAO.getSession().close();
		}
	}

	/**
	 * Crea una nueva entidad a partir de una entidad DAO y la retorna
	 * 
	 * @param pEntidad
	 * @return
	 */
	private Entidad crearEntidad(PEntidad pEntidad) {

		Entidad entidadRetornar = new Entidad();
		entidadRetornar.inicializarDatosNuevaEntidad();
		try {
			entidadRetornar.setIdEntidad(longToInt(pEntidad.getEntId()));
			entidadRetornar.setNombreEntidad(pEntidad.getEntNom());
			entidadRetornar.setIdTipoReportante(longToInt(pEntidad.getTipoReporta().getTreId()));
			entidadRetornar.setDireccionEntidad(pEntidad.getEntDir());
			entidadRetornar.setTelefonoEntidad(pEntidad.getEntTels());
			entidadRetornar.setFaxEntidad(pEntidad.getEntFax());
			entidadRetornar.setIdMunicipio(pEntidad.getPMunicipioEntidad().getMunId());
			entidadRetornar.setDescripcionEntidad(pEntidad.getEntDesc());
		} catch (Exception e) {
			log.error("Error al crear una entidad...", e);
		}
		return entidadRetornar;
	}

	/**
	 * Metodo para convertir un valor de long a int
	 * 
	 * @param valor
	 */
	private int longToInt(long valor) {
		return Integer.parseInt(String.valueOf(valor));
	}

	/**
	 * @return the dataPaginatorBinding
	 */
	public DataPaginator getDataPaginator() {
		return dataPaginator;
	}

	/**
	 * @param dataPaginatorBinding the dataPaginatorBinding to set
	 */
	public void setDataPaginator(DataPaginator dataPaginator) {
		this.dataPaginator = dataPaginator;
	}
	
	public int getCantidadResultados(){
		return this.listaEntidades.size();
	}
}
